core: Fix pull to actually download files too
authorColin Walters <walters@verbum.org>
Thu, 17 Nov 2011 15:40:55 +0000 (10:40 -0500)
committerColin Walters <walters@verbum.org>
Thu, 17 Nov 2011 15:40:55 +0000 (10:40 -0500)
src/libostree/ostree-repo.c
src/libostree/ostree-repo.h
src/ostree/ot-builtin-pull.c
tests/t0010-pull.sh

index 516d3e0f028908e45de3305f61e4c9aafd1d84d8..2d8e70d9b076f59828ca2cf4cfc963bc6b3189af 100644 (file)
@@ -935,13 +935,13 @@ ostree_repo_store_packfile (OstreeRepo       *self,
                             const char       *expected_checksum,
                             const char       *path,
                             OstreeObjectType  objtype,
+                            gboolean         *did_exist,
                             GError          **error)
 {
   OstreeRepoPrivate *priv = GET_PRIVATE (self);
   gboolean ret = FALSE;
   GString *tempfile_path = NULL;
   GChecksum *checksum = NULL;
-  gboolean did_exist;
 
   tempfile_path = g_string_new (priv->path);
   g_string_append_printf (tempfile_path, "/tmp-unpack-%s", expected_checksum);
@@ -960,7 +960,7 @@ ostree_repo_store_packfile (OstreeRepo       *self,
   if (!ostree_repo_store_object_trusted (self, tempfile_path ? tempfile_path->str : path,
                                          expected_checksum,
                                          objtype,
-                                         TRUE, FALSE, &did_exist, error))
+                                         TRUE, FALSE, did_exist, error))
     goto out;
 
   ret = TRUE;
index 22bb0e620158fb389e48e369c05d4a5849f6d360..b84004545d4efb22b0c971a8c224db328603749a 100644 (file)
@@ -73,6 +73,7 @@ gboolean      ostree_repo_store_packfile (OstreeRepo       *self,
                                            const char       *expected_checksum,
                                            const char       *path,
                                            OstreeObjectType  objtype,
+                                           gboolean         *did_exist,
                                            GError          **error);
 
 gboolean      ostree_repo_store_object_trusted (OstreeRepo   *self,
index a064abd16adacb798fe3f93549e881ad79433b37..bcf387b89a026a49aaf6126ad3e13ec57a47d0e3 100644 (file)
 
 #include <libsoup/soup-gnome.h>
 
+gboolean verbose;
+
 static GOptionEntry options[] = {
-  { NULL }
+  { "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose, "Show more information", NULL },
 };
 
+static void
+log_verbose (const char  *fmt,
+             ...) G_GNUC_PRINTF (1, 2);
+
+static void
+log_verbose (const char  *fmt,
+             ...)
+{
+  va_list args;
+  char *msg;
+
+  if (!verbose)
+    return;
+
+  va_start (args, fmt);
+  
+  msg = g_strdup_vprintf (fmt, args);
+  g_print ("%s\n", msg);
+  g_free (msg);
+}
+
 static gboolean
 fetch_uri (OstreeRepo  *repo,
            SoupSession *soup,
@@ -47,17 +70,18 @@ fetch_uri (OstreeRepo  *repo,
   int fd;
   SoupBuffer *buf = NULL;
   GFile *tempf = NULL;
+  char *uri_string = NULL;
   
+  uri_string = soup_uri_to_string (uri, FALSE);
+  log_verbose ("Fetching %s", uri_string);
   msg = soup_message_new_from_uri (SOUP_METHOD_GET, uri);
   
   response = soup_session_send_message (soup, msg);
   if (response != 200)
     {
-      char *uri_string = soup_uri_to_string (uri, FALSE);
       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
                    "Failed to retrieve '%s': %d %s",
                    uri_string, response, msg->reason_phrase);
-      g_free (uri_string);
       goto out;
     }
 
@@ -82,6 +106,7 @@ fetch_uri (OstreeRepo  *repo,
 
   ret = TRUE;
  out:
+  g_free (uri_string);
   g_free (template);
   g_clear_object (&msg);
   g_clear_object (&tempf);
@@ -111,7 +136,7 @@ store_object (OstreeRepo  *repo,
   if (!fetch_uri (repo, soup, obj_uri, &filename, error))
     goto out;
 
-  if (!ostree_repo_store_packfile (repo, object, filename, objtype, error))
+  if (!ostree_repo_store_packfile (repo, object, filename, objtype, did_exist, error))
     goto out;
 
   ret = TRUE;
@@ -144,7 +169,9 @@ store_tree_recurse (OstreeRepo   *repo,
   if (!store_object (repo, soup, base_uri, rev, OSTREE_OBJECT_TYPE_META, &did_exist, error))
     goto out;
 
-  if (!did_exist)
+  if (did_exist)
+    log_verbose ("Already have tree %s", rev);
+  else
     {
       if (!ostree_repo_load_variant (repo, rev, &metatype, &tree, error))
         goto out;
@@ -158,8 +185,8 @@ store_tree_recurse (OstreeRepo   *repo,
         }
       
       /* PARSE OSTREE_SERIALIZED_TREE_VARIANT */
-      g_variant_get_child (tree, 2, "@a(ss)", &files_variant);
-      g_variant_get_child (tree, 3, "@a(sss)", &dirs_variant);
+      files_variant = g_variant_get_child_value (tree, 2);
+      dirs_variant = g_variant_get_child_value (tree, 3);
       
       n = g_variant_n_children (files_variant);
       for (i = 0; i < n; i++)
@@ -167,7 +194,7 @@ store_tree_recurse (OstreeRepo   *repo,
           const char *filename;
           const char *checksum;
 
-          g_variant_get_child (files_variant, i, "(ss)", &filename, &checksum);
+          g_variant_get_child (files_variant, i, "(&s&s)", &filename, &checksum);
 
           if (!store_object (repo, soup, base_uri, checksum, OSTREE_OBJECT_TYPE_FILE, &did_exist, error))
             goto out;
@@ -180,13 +207,13 @@ store_tree_recurse (OstreeRepo   *repo,
           const char *tree_checksum;
           const char *meta_checksum;
 
-          g_variant_get_child (dirs_variant, i, "(sss)",
+          g_variant_get_child (dirs_variant, i, "(&s&s&s)",
                                &dirname, &tree_checksum, &meta_checksum);
 
-          if (!store_tree_recurse (repo, soup, base_uri, tree_checksum, error))
+          if (!store_object (repo, soup, base_uri, meta_checksum, OSTREE_OBJECT_TYPE_META, &did_exist, error))
             goto out;
 
-          if (!store_object (repo, soup, base_uri, meta_checksum, OSTREE_OBJECT_TYPE_META, &did_exist, error))
+          if (!store_tree_recurse (repo, soup, base_uri, tree_checksum, error))
             goto out;
         }
     }
@@ -219,7 +246,9 @@ store_commit_recurse (OstreeRepo   *repo,
   if (!store_object (repo, soup, base_uri, rev, OSTREE_OBJECT_TYPE_META, &did_exist, error))
     goto out;
 
-  if (!did_exist)
+  if (did_exist)
+    log_verbose ("Already have commit %s", rev);
+  else
     {
       if (!ostree_repo_load_variant (repo, rev, &metatype, &commit, error))
         goto out;
index e05dfa644c2d2e88df1abfeb390d9adfeafeb912..6bc7ff69b2a20c55af3a83f94bb85890674ea675 100755 (executable)
@@ -21,7 +21,7 @@ set -e
 
 . libtest.sh
 
-echo '1..1'
+echo '1..2'
 
 setup_fake_remote_repo1
 cd ${test_tmpdir}
@@ -30,3 +30,10 @@ $OSTREE init
 $OSTREE remote add origin $(cat httpd-address)/ostree/gnomerepo
 $OSTREE pull origin main
 echo "ok pull"
+
+cd ${test_tmpdir}
+$OSTREE checkout origin/main checkout-origin-main
+cd checkout-origin-main
+assert_file_has_content firstfile '^first$'
+assert_file_has_content baz/cow '^moo$'
+echo "ok pull contents"